package IO流.解压缩;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class 压缩文件夹 {
    public static void main(String[] args) throws IOException {
        //1.创建一个File对象，存在要压缩的文件夹
        File file=new File("D:\\A\\F");
        //2.获取要压缩文件的父级路径
        File destParent = file.getParentFile();
        //3.创建File表示压缩包的路径
        File dest=new File(destParent,file.getName()+".zip");
        //4.创建一个关联压缩包压缩文件流
        ZipOutputStream zos=new ZipOutputStream(new FileOutputStream(dest));
        //5.获取file中的每一个文件,变成ZipEntry对象放入到压缩包中
        toZip(file,zos, file.getName());
        //6.释放资源
        zos.close();
    }
    //定义一个压缩文件夹的方法
    /*
        file:要进行压缩的文件夹
        zos:关联压缩包文件的压缩输出流
        name:压缩包的名字
     **/
    public static void toZip(File file ,ZipOutputStream zos,String name) throws IOException {
        //1.获取文件中的所有文件
        File[] arr = file.listFiles();
        //2.遍历文件
        for (File f : arr) {
            //如果遍历到的是文件
            if (f.isFile()){
                //1.创建这个文件的ZipEntry对象--->表示压缩包内部的路径
                ZipEntry entry=new ZipEntry(name+"\\"+f.getName());
                //2.把entry对象放入zos中
                zos.putNextEntry(entry);
                //读取文件中的数据写入到压缩包中
                FileInputStream fis=new FileInputStream(f);
                byte[] bytes=new byte[1024*1024];
                int len;
                while ((len=fis.read(bytes))!=-1){
                    zos.write(bytes,0,len);
                }
                //释放资源
                fis.close();
                //关闭ZipEntry对象,表示这个文件已经读取完成
                zos.closeEntry();
            }else {
                //如果是文件夹,进行递归
                toZip(f,zos,name+"\\"+f.getName());
            }
        }

    }

}
